package luke.core.config;

import luke.core.logging.LogUtil;
import luke.core.utils.JsonUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

/**
 * 收藏管理器类
 * 用于管理用户收藏的文件列表
 */
public class FavoritesManager {
    private static final String FAVORITES_DIR = "favorites";
    private static final String FAVORITES_FILE_EXTENSION = ".json";
    
    private Path favoritesDir;
    
    public FavoritesManager() {
        initializeFavoritesDirectory();
    }
    
    /**
     * 初始化收藏目录
     */
    private void initializeFavoritesDirectory() {
        AppDataManager appDataManager = AppDataManager.getInstance();
        Path appDataDir = appDataManager.getAppDataDirectory();
        favoritesDir = appDataDir.resolve(FAVORITES_DIR);
        
        try {
            Files.createDirectories(favoritesDir);
        } catch (IOException e) {
            LogUtil.error("FavoritesManager", "创建收藏目录失败", e.getMessage());
        }
    }
    
    /**
     * 保存收藏列表
     * 
     * @param favoriteName 收藏名称
     * @param selectedFiles 已选择的文件集合
     */
    public void saveFavorite(String favoriteName, Set<File> selectedFiles) {
        try {
            // 创建文件名（使用收藏名称作为文件名，替换非法字符）
            String fileName = sanitizeFileName(favoriteName) + FAVORITES_FILE_EXTENSION;
            Path filePath = favoritesDir.resolve(fileName);
            
            // 将File对象转换为路径字符串列表进行序列化
            List<String> filePaths = new ArrayList<>();
            for (File file : selectedFiles) {
                filePaths.add(file.getAbsolutePath());
            }
            
            // 使用JsonUtils将文件路径列表写入JSON文件
            JsonUtils.writeToJson(filePaths, filePath.toString());
            LogUtil.info("FavoritesManager", "收藏保存", "已保存收藏 '" + favoriteName + "' 包含 " + selectedFiles.size() + " 个文件");
        } catch (Exception e) {
            LogUtil.error("FavoritesManager", "保存收藏失败", e.getMessage());
        }
    }
    
    /**
     * 加载收藏列表
     * 
     * @param favoriteName 收藏名称
     * @return 收藏的文件集合
     */
    public Set<File> loadFavorite(String favoriteName) {
        Set<File> favoriteFiles = new HashSet<>();
        try {
            // 创建文件名
            String fileName = sanitizeFileName(favoriteName) + FAVORITES_FILE_EXTENSION;
            Path filePath = favoritesDir.resolve(fileName);
            
            // 检查收藏文件是否存在
            if (Files.exists(filePath)) {
                // 从JSON文件读取文件路径列表
                List<String> filePaths = JsonUtils.readFromJson(filePath.toString(), List.class);
                
                // 将路径字符串转换为File对象
                for (String path : filePaths) {
                    File file = new File(path);
                    if (file.exists()) {  // 只添加仍然存在的文件
                        favoriteFiles.add(file);
                    }
                }
                
                LogUtil.info("FavoritesManager", "收藏加载", "已加载收藏 '" + favoriteName + "' 包含 " + favoriteFiles.size() + " 个文件");
            }
        } catch (Exception e) {
            LogUtil.error("FavoritesManager", "加载收藏失败", e.getMessage());
        }
        return favoriteFiles;
    }
    
    /**
     * 获取所有收藏名称
     * 
     * @return 收藏名称列表
     */
    public List<String> getAllFavoriteNames() {
        List<String> favoriteNames = new ArrayList<>();
        try {
            // 遍历收藏目录中的所有文件
            Files.list(favoritesDir)
                .filter(path -> path.toString().endsWith(FAVORITES_FILE_EXTENSION))
                .forEach(path -> {
                    String fileName = path.getFileName().toString();
                    // 移除文件扩展名获取收藏名称
                    String favoriteName = fileName.substring(0, fileName.length() - FAVORITES_FILE_EXTENSION.length());
                    favoriteNames.add(favoriteName);
                });
        } catch (IOException e) {
            LogUtil.error("FavoritesManager", "获取收藏列表失败", e.getMessage());
        }
        return favoriteNames;
    }
    
    /**
     * 清理文件名中的非法字符
     * 
     * @param fileName 原始文件名
     * @return 清理后的文件名
     */
    private String sanitizeFileName(String fileName) {
        // 移除或替换文件系统不支持的字符
        return fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
    }
    
    /**
     * 删除收藏
     * 
     * @param favoriteName 收藏名称
     */
    public void deleteFavorite(String favoriteName) {
        try {
            // 创建文件名
            String fileName = sanitizeFileName(favoriteName) + FAVORITES_FILE_EXTENSION;
            Path filePath = favoritesDir.resolve(fileName);
            
            // 删除文件
            if (Files.exists(filePath)) {
                Files.delete(filePath);
                LogUtil.info("FavoritesManager", "收藏删除", "已删除收藏 '" + favoriteName + "'");
            }
        } catch (Exception e) {
            LogUtil.error("FavoritesManager", "删除收藏失败", e.getMessage());
        }
    }
}